最後幾天的時間,將介紹特徵擷取(Feature Extraction)技術。首先,將介紹基本概念,接著帶入幾個特徵擷取的相關技術實作,例如:輪廓搜尋、形狀特徵、輪廓特徵等等。
由於數位影像是由二維陣列或矩陣構成,牽涉的資料量相當龐大,不利於進一步的影像分析或物件辨識。因此,學術界的學者專家持續投入研究,希望在數位影像中擷取有用的資訊,稱為特徵(Feature)。
所謂的特徵,其實沒有明確定義,通常是泛指有利於影像分析或物件辨識的相關資訊,或是指影像物件的表示法,可以提供量化的數據資料。
特徵擷取(Feature Extraction)技術,目的是根據二維的數位影像,經過數學運算與處理,希望可以擷取一維的影像特徵資料,稱為特徵向量(Feature Vector)。這樣我們就可以根據擷取的特徵向量,進行後續的影像分析或物件辨識。
由於特徵擷取技術將二維的資料形成一維的資料,因此也牽涉降維度運算,例如:主成分分析(Principal Component Analysism PCA)等。
給定二值影像中的物件,輪廓(Contour)可以定義為:「沿著物件邊緣搜尋邊緣像素所形成的路徑。」
也就是說,輪廓可以使用像素座標的序列表示,順序通常是採用順時針或逆時針方向,從物件邊緣左上角的像素開始搜尋,並依照8-相鄰(或4-相鄰)原則依序紀錄像素座標。搜尋輪廓所形成的像素座標序列,也可簡稱為鍊(Chain)。
輪廓搜尋的目的即是根據二值影像,搜尋影像中物件的輪廓,並以特定的資料結構儲存,紀錄輪廓的相關資料,由於影像中可能包含多個物件,因此物件是以階層式(Hierarchy)的資料結構儲存。
而在這裏的輪廓,指的是外部輪廓。若物件內部包含洞(Holes),則該物件在洞的邊緣所形成的輪廓,稱為內部輪廓。OpenCV提供搜尋羅克演算法,稱為findContours函式。cv2.FindCointours(img, storage, mode = CV_RETR_LIST, method = CV_CHAIN_APPROX_SIMPLE, offset = (0, 0))
針對函式中的參數做以下講解:
程式碼如下:
import numpy as np
import cv2
import math
img1 = cv2.imread("D:/Desktop/IThome/text3.bmp", 0)
img2 = cv2.cvtColor(img1, cv2.COLOR_GRAY2BGR)
contours, hierarchy = cv2.findContours(img1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cv2.drawContours(img2, contours, -1, (255, 0, 0), thickness = 2)
cv2.imshow("Original", img1)
cv2.imshow("After", img2)
cv2.waitKey()
cv2.destroyAllWindows()
結果如下: